{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fisher判别（LDA）"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image-2.png](https://img-blog.csdnimg.cn/20200505123848749.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RpbWVfYm9vaw==,size_16,color_FFFFFF,t_70)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用二分类来分析，设样本数据集为D = { ( X , Y ) } ， X i 是 第 i 类 样 本 的 集 合 ， i ∈ {   0 , 1 } 要找的最佳投影为W。\n",
    "\n",
    "记mi为第i类样本质心,Ni为第i类的数量\n",
    "![image.png](https://img-blog.csdn.net/20180118162725885)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.最大类间离散度矩阵：即要投影后两个样本的质心离得越远越好。\n",
    "![image-6.png](https://img-blog.csdn.net/20180118162843127)\n",
    "\n",
    "2.最小类内离散度矩阵：即要使得投影后同一类的样本点尽可能聚拢在一起，离质心越近越好。\n",
    "![image.png](https://img-blog.csdn.net/20180118162737730)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fisher准则函数定义：\n",
    "![image-3.png](https://img-blog.csdn.net/20180118163104280)\n",
    "其中![image-4.png](https://img-blog.csdn.net/20180118163254326)\n",
    "是两类均值之差，是样本类内离散度。显然，应该使JF(w)的分子尽可能大而分母尽可能小，即应寻找使JF(w)尽可能大的w作为投影方向。但上式中并不显含w，因此须设法将JF(w)变成w的显函数。\n",
    "由各类样本的均值可推出：\n",
    "![image-5.png](https://img-blog.csdn.net/20180118163338127)\n",
    "这样，Fisher准则函数JF(w)的分子可写成：\n",
    "![image-6.png](https://img-blog.csdn.net/20180118163408057)\n",
    "因此也可得到：\n",
    "![image-7.png](https://img-blog.csdn.net/20180118163507002)\n",
    "将上述各式代入JF(w)，可得：\n",
    "![image-8.png](https://img-blog.csdn.net/20180118163540029)\n",
    "其中Sb为样本类间离散度矩阵，Sw为总样本类内离散度矩阵。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为求取极大值时的w*，我们采用拉格朗日乘子法求解。\n",
    "定义函数：\n",
    "![image-1.png](https://img-blog.csdn.net/20180118163826186)\n",
    "其中λ为拉格朗日乘子。将上式对w求偏导数，可得：\n",
    "![image-2.png](https://img-blog.csdn.net/20180118163856609)\n",
    "令偏导数为零，有:\n",
    "![image-3.png](https://img-blog.csdn.net/20180118163956851)\n",
    "其中w*就是JF(w)的极值解。因为Sw非奇异，将上式两边左乘 Sw的逆，可得：\n",
    "![image-4.png](https://img-blog.csdn.net/20180118164029903)\n",
    "上式为求一般矩阵Sw^(-1)*Sb的特征值问题\n",
    "利用![image-5.png](https://img-blog.csdn.net/20180118164243050)的定义\n",
    "将上式左边的SbW*写成：\n",
    "![image-6.png](https://img-blog.csdn.net/20180118164358699)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "令![image-1.png](https://img-blog.csdn.net/20180118164434272)\n",
    "这是一个标量。因此λw*可写成：\n",
    "![image-2.png](https://img-blog.csdn.net/20180118164617533)\n",
    "从而可得：\n",
    "![image-3.png](https://img-blog.csdn.net/20180118164701190)\n",
    "由于我们的目的是寻找最佳的投影方向，w*的比例因子对此并无影响，因此可忽略比例因子R/λ,有：\n",
    "![image-4.png](https://img-blog.csdn.net/20180118164732076)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "于是我们得到，使用Fisher准则求最佳法线向量的解为：  W* = S1^(-1)·（m1-m0），此时Fisher准则函数J（W）达到极大值。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(1)实现两类iris分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     0    1    2    3            4\n",
      "0  5.1  3.5  1.4  0.2  Iris-setosa\n",
      "1  4.9  3.0  1.4  0.2  Iris-setosa\n",
      "2  4.7  3.2  1.3  0.2  Iris-setosa\n",
      "3  4.6  3.1  1.5  0.2  Iris-setosa\n",
      "4  5.0  3.6  1.4  0.2  Iris-setosa\n",
      "5  5.4  3.9  1.7  0.4  Iris-setosa\n",
      "6  4.6  3.4  1.4  0.3  Iris-setosa\n",
      "7  5.0  3.4  1.5  0.2  Iris-setosa\n",
      "8  4.4  2.9  1.4  0.2  Iris-setosa\n",
      "9  4.9  3.1  1.5  0.1  Iris-setosa\n",
      "随机抽取第55个样本\n",
      "随机抽取的[[2.8 1.3]]属于 Ω2 类.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "import random\n",
    "\n",
    "#  把来自两类w1，w2的训练样本集X分成与w1和w2分别对应的训练样本集X1和X2\n",
    "def load_data():\n",
    "    path = 'Iris.data'\n",
    "    data = pd.read_csv(path,header=None)\n",
    "    print(data.head(10))\n",
    "    x1 = data.loc[0:49,[1,3]].values\n",
    "    x2 = data.loc[50:99,[1,3]].values\n",
    "    x3 = data.loc[0:99,[1,3]].values\n",
    "    return x1,x2,x3\n",
    "x,y,z = load_data()\n",
    "x1 = np.mat(x)\n",
    "x2 = np.mat(y)\n",
    "x3 = np.mat(z)  # 用于随机测试\n",
    "\n",
    "#  计算各类样本的均值向量 mi\n",
    "def calculate_mean(samples):\n",
    "    mean_mat = np.mean(samples,axis=0)\n",
    "    return mean_mat.T\n",
    "\n",
    "\n",
    "#  计算样本类内离散度矩阵\n",
    "def calculate_inclass_sactter(input_class,input_mean):\n",
    "    sample_mean = input_class - input_mean\n",
    "    Sk = ([[0,0],[0,0]])\n",
    "    for i in range(len(sample_mean)):\n",
    "        x = np.mat(sample_mean[i]).T\n",
    "        Sk += np.dot(x,x.T)\n",
    "    return Sk\n",
    "\n",
    "# #  计算 g(x) = W.T 判断g(x)与Y_0的大小，大于Y0属于Ω1类，小于属于Ω2类\n",
    "def judge_class(input_element):\n",
    "    Y_0 = (w.T * (m1+m2))/2\n",
    "    g_x = w.T * input_element.T\n",
    "    flag = g_x[(0,0)] - Y_0[(0,0)]\n",
    "    if flag > 0:\n",
    "        print(f\"随机抽取的{input_element}属于 Ω1 类.\")\n",
    "    elif flag < 0:\n",
    "        print(f\"随机抽取的{input_element}属于 Ω2 类.\")\n",
    "    else:\n",
    "        print(f\"无法确定随机抽取的{input_element}属于哪一类.\")\n",
    "\n",
    "# ### ---> 画出分类线以及投影线，以及投影后的点\n",
    "def new_coordinate(input_class,input_color):\n",
    "    for i in range(len(input_class)):\n",
    "        x_new_1 = (input_class[i].tolist())[0]\n",
    "        mod_w_1 = math.sqrt(w1[0]**2 + w1[1]**2)\n",
    "        dot_multi_1 = w1[0] * x_new_1[0] + w1[1] * x_new_1[1]\n",
    "        #投影后的坐标矩阵\n",
    "        x_new_mat_1 = dot_multi_1 / mod_w_1 * (w.T/mod_w_1)\n",
    "        plt.scatter(x_new_mat_1[0,0], x_new_mat_1[0,1], color=input_color, marker='x')\n",
    "\n",
    "#均值        \n",
    "m1 = calculate_mean(x1) \n",
    "m2 = calculate_mean(x2)\n",
    "\n",
    "#离散度矩阵\n",
    "sk1 = calculate_inclass_sactter(x1,m1.T) \n",
    "sk2 = calculate_inclass_sactter(x2,m2.T)\n",
    "\n",
    "#计算总类内离散度矩阵 Sw = S1 + S2\n",
    "Sw = sk1 + sk2\n",
    "\n",
    "#计算Sw的逆矩阵\n",
    "Sw_inv = np.mat(Sw).I\n",
    "\n",
    "#求解权向量：w = Sw(逆)(m1-m2)\n",
    "w = (Sw_inv * (np.mat(m1 - m2)))\n",
    "w1 = ((w.T).tolist())[0]  #取矩阵中的两个元素，以便接下来的向量运算\n",
    "\n",
    "random_number = random.randint(0,99)\n",
    "print(f\"随机抽取第{random_number}个样本\")\n",
    "judge_class(x3[random_number])\n",
    "\n",
    "#画出两条直线直观观察\n",
    "x_x = np.linspace(0, 8, 10)\n",
    "x_x_1 = np.linspace(-2, 2, 10)\n",
    "y_y = -(w1[0] * x_x) / w1[1]\n",
    "y_y_1 = (w1[1] * x_x_1) / w1[0]\n",
    "\n",
    "new_coordinate(x1,'red') #投影点\n",
    "new_coordinate(x2,'green')\n",
    "\n",
    "plt.plot(x_x, y_y)\n",
    "plt.plot(x_x_1, y_y_1)\n",
    "plt.scatter(x[:49,0],x[:49,1],color='red',marker='o')\n",
    "plt.scatter(y[:49,0],y[:49,1],color='blue',marker='x')\n",
    "plt.xlabel('length of petal')\n",
    "plt.ylabel('length of scape')\n",
    "plt.title('Fisher Criterion')\n",
    "plt.grid()\n",
    "plt.axis('equal')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(2)实现实验书中三类(3维特征)数据分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10, 3)\n",
      "测试的[[-0.7    0.58   0.089]]属于 w1 类.\n",
      "测试的[[ 0.047 -0.4    1.04 ]]属于 w2 类.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "\n",
    "w1 = np.array([[-0.4,0.58,0.089],[-0.31,0.27,-0.04],[-0.38,0.055,-0.035],[-0.15,0.53,0.011],\n",
    "             [-0.35,0.47,0.034],[-0.17,0.69,0.1],[-0.011,0.55,-0.18],[-0.27,0.61,0.12],\n",
    "             [-0.065,0.49,0.0012],[-0.12,0.054,-0.063]])\n",
    "w2 = np.array([[0.8,1.6,-0.014],[1.1,1.6,0.48],[-0.44,-0.41,0.32],[0.047,-0.45,1.4],\n",
    "             [0.28,0.35,3.1],[-0.39,-0.48,0.11],[0.34,-0.079,0.14],[-0.3,-0.22,2.2],\n",
    "             [1.1,1.2,-0.46],[0.18,-0.11,-0.49]])\n",
    "w3 = np.array([[1.58,2.32,-5.8],[0.67,1.58,-4.78],[1.04,1.01,-3.63],[-1.49,2.18,-3.39],\n",
    "             [-0.41,1.21,-4.73],[1.39,3.61,2.87],[1.2,1.4,-1.89],[-0.92,1.44,-3.22],\n",
    "             [0.45,1.33,-4.38],[-0.76,0.84,-1.96]])\n",
    "# print(w1.shape)\n",
    "w1 = np.mat(w1)\n",
    "w2 = np.mat(w2)\n",
    "w3 = np.mat(w3)\n",
    "print(w1.shape)\n",
    "#测试数据 xx1=[-0.7,0.58,0.089].T  xx2=[0.047,-0.4,1.04].T\n",
    "\n",
    "#  计算各类样本的均值向量 mi\n",
    "def calculate_mean(samples):\n",
    "    mean_mat = np.mean(samples,axis=0)\n",
    "    return np.mat(mean_mat).T\n",
    "\n",
    "\n",
    "#  计算样本类内离散度矩阵\n",
    "def calculate_inclass_sactter(input_class,input_mean):\n",
    "    sample_mean = input_class - input_mean\n",
    "    Sk = ([[0,0,0],[0,0,0],[0,0,0]])\n",
    "    for i in range(len(sample_mean)):\n",
    "        # x = np.mat(sample_mean[i]).T\n",
    "        x = sample_mean[i].T\n",
    "        Sk += np.dot(x,x.T)\n",
    "    return Sk\n",
    "\n",
    "#  计算 g(x) = W.T 判断g(x)与Y_0的大小，大于Y0属于Ω1类，小于属于Ω2类\n",
    "def judge_class(input_element):\n",
    "    Y_0 = (w1_2.T * (m1+m2))/2\n",
    "    g_x = w1_2.T * input_element.T\n",
    "    flag = g_x - Y_0\n",
    "    if flag > 0:\n",
    "        print(f\"测试的{input_element}属于 w1 类.\")\n",
    "    elif flag < 0:\n",
    "        print(f\"测试的{input_element}属于 w2 类.\")\n",
    "    else:\n",
    "        print(f\"无法确定测试的{input_element}属于哪一类.\")\n",
    "\n",
    "\n",
    "#均值\n",
    "m1 = calculate_mean(w1) \n",
    "m2 = calculate_mean(w2)\n",
    "m3 = calculate_mean(w3)\n",
    "\n",
    "#离散度矩阵\n",
    "sk1 = calculate_inclass_sactter(w1,m1.T) \n",
    "sk2 = calculate_inclass_sactter(w2,m2.T)\n",
    "sk3 = calculate_inclass_sactter(w3,m3.T)\n",
    "\n",
    "#计算总类内离散度矩阵 Sw = S1 + S2\n",
    "Sw1_2 = sk1 + sk2\n",
    "Sw1_3 = sk1 + sk3\n",
    "Sw2_3 = sk2 + sk3\n",
    "\n",
    "#计算Sw的逆矩阵\n",
    "Sw_inv1_2 = np.mat(Sw1_2).I\n",
    "Sw_inv1_3 = np.mat(Sw1_3).I\n",
    "Sw_inv2_3 = np.mat(Sw2_3).I\n",
    "\n",
    "#求解权向量：w = Sw(逆)(m1-m2)\n",
    "w1_2 = (Sw_inv1_2 * (np.mat(m1 - m2)))\n",
    "# print(w1_2)\n",
    "w1_3 = (Sw_inv1_3 * (np.mat(m1 - m3)))\n",
    "w2_3 = (Sw_inv2_3 * (np.mat(m2 - m3)))\n",
    "\n",
    "w_1_2 = ((w1_2.T).tolist())[0]  #取矩阵中的元素，以便接下来的向量运算\n",
    "# print(w_1_2)\n",
    "w_1_3 = ((w1_3.T).tolist())[0]\n",
    "w_2_3 = ((w2_3.T).tolist())[0]\n",
    "\n",
    "#判别属于哪一类\n",
    "xx1 = np.mat([-0.7,0.58,0.089])\n",
    "xx2=np.mat([0.047,-0.4,1.04])\n",
    "judge_class(xx1)\n",
    "judge_class(xx2)\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = Axes3D(fig)\n",
    "z1 = ((w1_2.T * w1.T).tolist())[0]\n",
    "z2 = ((w1_2.T * w2.T).tolist())[0]\n",
    "# print(z1)\n",
    "# print(z2)\n",
    "x = np.linspace(-1,1,10)\n",
    "\n",
    "for i in range(10):\n",
    "    plt.plot(z1[i]*w_1_2[0],z1[i]*w_1_2[1],z1[i]*w_1_2[2],color='red',marker='x')\n",
    "    plt.plot(z2[i]*w_1_2[0],z2[i]*w_1_2[1],z2[i]*w_1_2[2], color='green', marker='x')\n",
    "plt.plot(x,x*w_1_2[1]/w_1_2[0],x*w_1_2[2]/w_1_2[0])\n",
    "ax.scatter(w1[:,0],w1[:,1],w1[:,2], c='r',marker='o')\n",
    "ax.scatter(w2[:,0],w2[:,1],w2[:,2], c='b',marker='o')\n",
    "# ax.scatter(w3[:,0],w3[:,1],w3[:,2], c='g',marker='o')\n",
    "ax.set_zlabel('Z', fontdict={'size': 20, 'color': 'red'})\n",
    "ax.set_ylabel('Y', fontdict={'size': 20, 'color': 'red'})\n",
    "ax.set_xlabel('X', fontdict={'size': 20, 'color': 'red'})\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "补充：三类判别可以看作一个个的二类判别，只需要修改上述程序中的输入的哪一类的权向量即可（w1_2，w1_3，w2_3----分别对应哪两类）。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
